package net.suplementos.servico;

import java.util.List;

import javax.ejb.Remote;

import net.suplementos.exception.CampoObrigatorioException;
import net.suplementos.exception.RegistroInexistenteException;
import net.suplementos.exception.RegistroJaExistenteException;
import net.suplementos.pojo.BaixaProduto;
import net.suplementos.pojo.Cliente;
import net.suplementos.pojo.Estoque;
import net.suplementos.pojo.FormaPagamento;
import net.suplementos.pojo.Fornecedor;
import net.suplementos.pojo.Lote;
import net.suplementos.pojo.Marca;
import net.suplementos.pojo.Produto;

@Remote
public interface ControleServico {

	List<Fornecedor> consultar(Fornecedor fornecedor) throws CampoObrigatorioException;

	List<FormaPagamento> listarFormasPagamentoFornecedor(Fornecedor fornecedor) throws RegistroInexistenteException;

	Fornecedor getFornecedor(Integer id);

	void alterar(Fornecedor fornecedor) throws CampoObrigatorioException, RegistroInexistenteException;

	void salvar(Fornecedor fornecedor) throws CampoObrigatorioException, RegistroJaExistenteException;

	void associarFornecedorMarca(Fornecedor fornecedor, Marca marca) throws CampoObrigatorioException, RegistroJaExistenteException;
	
	void associarFornecedorProduto(Fornecedor fornecedor, Produto produto) throws CampoObrigatorioException, RegistroJaExistenteException;

	void desassociarFornecedorMarca(Fornecedor fornecedor, Marca marca) throws CampoObrigatorioException, RegistroJaExistenteException;
	
	void desassociarFornecedorProduto(Fornecedor fornecedor, Produto produto) throws CampoObrigatorioException, RegistroJaExistenteException;

	List<Cliente> consultar(Cliente cliente) throws CampoObrigatorioException;

	Cliente getCliente(Integer id);

	void alterar(Cliente cliente) throws CampoObrigatorioException, RegistroInexistenteException;

	void salvar(Cliente cliente) throws CampoObrigatorioException;
	
	void salvar(Lote lote) throws CampoObrigatorioException;

	void alterar(Lote lote) throws CampoObrigatorioException;
	
	List<Lote> listarLotesEstoque(Estoque estoque);
	
	List<Produto> consultarProdutosAtivos(Produto produto) throws CampoObrigatorioException;
	
	void efetuarBaixaProduto(BaixaProduto baixaProduto) throws CampoObrigatorioException;
	
	Estoque getOuCriaEstoque(Produto produto);
	
	Lote getLote(Integer id);
}
